package org.muyu;

import org.muyu.component.Component;
import org.muyu.component.Composite;
import org.muyu.component.Leaf;

/**
 * 结构型模式 => 组合模式
 *
 * 组成部件
 * 1. 抽象的组件对象【Component】
 * 2. 叶子节点对象【Leaf】
 * 3. 组合对象【Composite】
 *
 * 将对象组合成树形结构以表示“部分-整体”的层次结构。
 * 组合模式使得用户对单个对象和组合对象的使用具有一致性。
 *
 * 案例理解
 * 1. 定义一个抽象的组件对象Component，这个对象可以是抽象类，也可以是接口
 * 2. 让Leaf和Composite继承Component去实现其中的方法
 * 3. 在Client调用方法时，不需要关注具体是树还是叶子，只需要调用统一的方法即可
 *
 */
public class Client {
    public static void main(String[] args) {
        //定义所有的组合对象
        Component root = new Composite("服装");
        Component c1 = new Composite("男装");
        Component c2 = new Composite("女装");

        //定义所有的叶子对象
        Component leaf1 = new Leaf("衬衣");
        Component leaf2 = new Leaf("夹克");
        Component leaf3 = new Leaf("裙子");
        Component leaf4 = new Leaf("套装");

        //按照树的结构来组合组合对象和叶子对象
        root.addChild(c1);
        root.addChild(c2);
        c1.addChild(leaf1);
        c1.addChild(leaf2);
        c2.addChild(leaf3);
        c2.addChild(leaf4);
        //调用根对象的输出功能来输出整棵树
        root.printStruct("");
    }
}
